class MVVM {
    constructor(options) {
        // 将实例作用域el（根元素结点）和模板绑定数据data挂到MVVM实例上
        const { el, data } = options;
        this.$el = el;
        this.$data = data;

        // 编译模板
        if (this.$el) {
            // (5/6)对data进行数据劫持
            new Observer(this.$data)

            // 对data进行数据代理（见本类）
            this.proxyData(this.$data)

            // (2/6)对el进行编译
            new Compile(this.$el, this)
        }
    }
    proxyData (data) {
        // 代理数据
        Object.keys(data).forEach(key => {
            // 数据劫持的核心方法Object.defineProperty添加getter和setter
            Object.defineProperty(this, key, {
                get () {
                    return data[key];
                },
                set (newVal) {
                    data[key] = newVal;
                }
            })
        })
    }
}